package com.example.first.thread;

import java.util.List;

/**
 * @Author LSQ
 * @Description TODO
 * @date 2021/8/29 15:48
 * @Version 1.0
 */

public class LearnSynchronized {

    /**
     * 指令重排，多线程情况下，计算机认为指令重排不影响结果
     * 加上volatile后，禁止指令重排，避免出现代码乱序执行的情况
     * 内存屏障 Memory Barrier，又称为内存栅栏，是CPU的一个指令，作用1：保证操作的顺序执行; 作用2：保证变量的可见性
     * <p>
     * 硬件层的内存屏障
     * 1、Load barrier
     * 2、Store barrier
     * 3、M fence
     * 4、L
     * <p>
     * <p>
     * 创建对象有3个步骤，如果多线程情况下，下面3步骤发生了指令重排，就会出现空指针异常；加上volatile后，就能防止指令重排
     * 1、分配内存空间 memory=allocate()
     * 2、初始化对象 instance(memory)
     * 3、对象指向分配的内存空间
     * <p>
     * Java并发编程 synchronized是悲观锁，事无巨细，都锁住，可以确保万无一失 适用场景： 并发写入多的情况
     */

    private static LearnSynchronized learnSynchronized;

    public LearnSynchronized() {
    }

    public static LearnSynchronized getInstance() {
        if (learnSynchronized == null) {
            synchronized (LearnSynchronized.class) {
                if (learnSynchronized == null) {
                    // 多线程情况，下面这条语句可能出现问题，因为new一个对象有3个步骤
                    learnSynchronized = new LearnSynchronized();
                }
            }
        }
        return learnSynchronized;
    }

    public void info() {
        System.out.println("Learn Java...");

    }

    public static void main(String[] args) {
        LearnSynchronized learnSynchronized = new LearnSynchronized();
        learnSynchronized.info();
    }
}
